package einlesenUndDatenverwaltung;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JOptionPane;

/**
 * Die Klasse BuchungsListe baut Objekte des Typs BuchungsListe, Sie fuegt
 * einzelne Buchungsobjekte hinzu und gibt diese zurueck.
 * 
 * 
 * @author (Kerstin Schulze)
 * @version (17.1.2014)
 */
public class BuchungsListe {
	// Buchungsobjekt
	private Buchung buchung;
	// Anzahl der Buchungen
	private int anzahl;
	// Vector fuer Buchungsobjekte
	private Vector<Buchung> buchungsliste;
	private ArrayList anzBuchungenStudent;
	private ArrayList anzBuchungenKurs;

	/**
	 * Konstruktor zur Erzeugung der BuchungsListen-Objekte.
	 */
	public BuchungsListe() {
		buchungsliste = new Vector<Buchung>();

	}

	/**
	 * Methode zum Hinzufuegen einer Buchung zur Buchungsliste.
	 * 
	 * @param buchung
	 *            (Buchung)- die hinzuzufuegende Buchung
	 */
	public void addElement(Buchung buchung) {
		// Abfrage ob ein Objekt schon im Vector enthalten ist.
		if (!buchungsliste.contains(buchung)) {
			// Hinzufuegen des Objektes, da Objekt noch nicht enthalten ist.
			buchungsliste.addElement(buchung);
		} else {
			// Fehlerausgabe, da Objekt schon enthalten.
			System.out
					.println("Fehler! Buchungsobjekt mit der Attributsbelegung Student/Kurs "
							+ buchung.getStudent()
							+ buchung.getKurs()
							+ "' schon enthalten");
		}

	}

	/**
	 * Gibt die Anzahl der Studentenobjekte in der Liste zurueck.
	 * 
	 * @return Anzahl der Objekte in der Liste als int.
	 */
	public int anzBuchungen() {
		return buchungsliste.size();
	}

	/**
	 * Methode zur Rueckgabe eines Buchungsobjektes.
	 * 
	 * @return (Buchung)- ein Buchungsobjekt
	 */
	public Buchung getBuchung() {
		return buchung;
	}

	/**
	 * Methode zur Rueckgabe eines Buchungsobjektes an Index.
	 * 
	 * @param index
	 *            (int) - Index des gesuchten Elements
	 * @return (Buchung)- ein Buchungsobjekt am Index
	 */
	public Buchung getBuchungAtIndex(int in_Nummer) {
		return (Buchung) buchungsliste.elementAt(in_Nummer);
	}

	/**
	 * Methode zur Rueckgabe des Vectors Buchungsliste.
	 * 
	 * @return buchungsliste (buchungsliste) - die Buchungsliste
	 */
	public Vector<Buchung> getBuchungsliste() {
		return buchungsliste;
	}

	/**
	 * Methode zum Setzen des Vectors Buchungsliste.
	 * 
	 * @param buchungsliste
	 *            (Vector) die zu setzende Buchungsliste
	 */
	public void setBuchungsliste(Vector<Buchung> buchungsliste) {
		this.buchungsliste = buchungsliste;
	}

	/**
	 * Methode zum Loeschen von Buchungsobjekt am Index.
	 * 
	 * @param index
	 *            (int) Index der zu loeschenden Buchung
	 */
	public void removeElement(int index) {
		// Abfrage ob ein Objekt schon im Vector enthalten ist.
		if (buchungsliste.size() > index) {
			// loeschen des Objektes
			buchungsliste.removeElementAt(index);
		} else {
			// Terminalfensterausgabe im Fehlerfall
			System.out.println("Fehler! Buchungsobjekt nicht geloescht!");
		}
	}

	/**
	 * Methode zum Entfernen doppelter Buchungen aus Buchungsliste. Es wird
	 * immer die zweite Buchung entfernt.
	 * 
	 * @param bl
	 *            (BuchungsListe) die Buchungsliste, die bereinigt werden soll
	 * @param sl
	 *            (StudentenListe) die Studentenliste, um zu schauen, ob mehrere
	 *            Buchungen vorliegen
	 * @return bl (BuchungsListe) die bereinigte Buchungsliste
	 * 
	 */
	public BuchungsListe makeUnique(BuchungsListe bl, StudentenListe sl) {
		int vergleichsObjekt;
		int vergleichsKurs = 0;
		ArrayList geloeschteObj = new ArrayList();

		for (int i = 0; i < sl.anzStudenten(); i++) {
			// Vergleichsobjekt aus Studentenliste holen-> Matrikelnummer
			vergleichsObjekt = sl.getStudent(i).getMatrikelnummer();
			// zaehler, wie oft ist Student enthalten
			int zaehler = 0;

			// Abroedeln der Buchungsliste
			for (int j = 0; j < bl.anzBuchungen(); j++) {
				Buchung bu = (Buchung) bl.getBuchungAtIndex(j);
				// wie oft tritt Student in Buchungsliste auf?
				if (vergleichsObjekt == bu.getStudent()) {
					// erhoehen des zaehlers
					zaehler++;
					System.out
							.println("---------------Meth. make Unique Student: "
									+ bu.getStudent() + " Zaehler: " + zaehler);
					// wenn der Student ueber mehrere Buchungen verfuegt,
					// vergleichen, ob bei diesen die Kursid gleich ist
					if (zaehler > 1) {
						if (bu.getKurs() == vergleichsKurs) {

							System.out
									.println("---------------doppelte Buchung Bu.getKurs--------"
											+ bu.getKurs());
							geloeschteObj.add(bu);
							// loeschen des gefundenen elements
							bl.removeElement(j);

						}
					}
					// merken Vergleichskurs
					vergleichsKurs = bu.getKurs();
					System.out
							.println("---------------Meth. make Unique Vergleichskurs: "
									+ vergleichsKurs);
				}
			}
		}
		System.out.println("unique Buchungsliste Groesse nach dem loeschen: "
				+ bl.anzBuchungen());
		for (int z = 0; z < geloeschteObj.size(); z++) {
			Buchung bugel = (Buchung) geloeschteObj.get(z);
			System.out.println("geloeschte Elemente: " + bugel.getStudent()
					+ ", " + bugel.getKurs());
		}

		return bl;
	}

	/**
	 * Methode zum Loeschen von Buchungen nach Kursid.
	 * 
	 * @param kursMitAmMeistenBuchungen
	 * @return hatGeklappt (boolean)- loeschen erfolgreich
	 */
	public boolean removeElementByKurs(Kurs kursMitAmMeistenBuchungen) {
		Vector<Buchung> vb = new Vector<Buchung>();
		// vb = buchungsliste;
		boolean hatGeklappt = false;
		for (int i = 0; i < buchungsliste.size(); i++) {
			if (buchungsliste.elementAt(i).getKurs() == kursMitAmMeistenBuchungen
					.getKursid()) {
				// buchungsliste.removeElementAt(i);
				// buchungsliste.re

				vb.addElement(buchungsliste.elementAt(i));
				System.out.println("remove: "
						+ buchungsliste.elementAt(i).toString());
				hatGeklappt = true;
			}

		}
		System.out.println("buchungsliste.size vor remove: "
				+ buchungsliste.size());
		buchungsliste.removeAll(vb);
		System.out.println("buchungsliste.size: " + buchungsliste.size());
		// buchungsliste
		return hatGeklappt;

	}

	/**
	 * Listen Korrigieren, Buchungen mit Studenten die nicht in der Studentenliste sind werden geloescht
	 * 
	 * @author Max Bogner
	 * @param sl
	 *            (Vector) die Studentenliste
	 * @param kl
	 *            (Vector) die Kursliste
	 */
	public void makeKorrektBuchungsliste(Vector<Student> sl, Vector<Kurs> kl) {
		// ueberpruefen ob keine nicht existierender student vorhanden ist
		Vector<Buchung> BuKorrekt = new Vector<Buchung>();
		for (int i = 0; i < buchungsliste.size(); i++) {
			// Vector<Kurs> kurslisteKorrekt = new Vector<Kurs>();

			// studentenliste durchgehen
			for (int s = 0; s < sl.size(); s++) {
				if (buchungsliste.elementAt(i).getStudent() == sl.elementAt(s)
						.getMatrikelnummer()) {
					BuKorrekt.add(buchungsliste.elementAt(i));
				}
			}
		}

		buchungsliste.removeAllElements();
		buchungsliste = BuKorrekt;// pkl.setPlatzkartenliste(pklKorrekt);

	}

}
